package rPCVersion1.client;


import lombok.AllArgsConstructor;
import rPCVersion1.common.RPCRequest;
import rPCVersion1.common.RPCResponse;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

@AllArgsConstructor
public class ClientProxy implements InvocationHandler {
//传入参数Service接口的class对象，反射封装成一个request
    private String host;
    private int port;
//jdk 动态代理， 每一次代理对象调用方法，会经过此方法增强（反射获取request对象，socket发送至客户端）
    @Override
//proxy :动态生成的代理类
//method : 与代理类对象调用的方法相对应
//args : 当前 method 方法的参数
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // request的构建，使用了lombok中的builder，代码简洁

        RPCRequest request = RPCRequest.builder().interfaceName(method.getDeclaringClass().getName())
                .methodName(method.getName())
                .params(args).paramsTypes(method.getParameterTypes()).build();
        //数据传输
        RPCResponse response = IOClient.sendRequest(host, port, request);
        //System.out.println(response);
        return response.getData();
    }
//Proxy 类中使用频率最高的方法是：newProxyInstance() ，这个方法主要用来生成一个代理对象。
    <T>T getProxy(Class<T> clazz){
//参数：类加载器用于加载代理对象，被代理类实现的接口，实现了InvocationHandler接口的对象
        Object o = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, this);
        return (T)o;
    }
}
